Week2-Dynamic-Web-Architecture

Week 2: 동적 웹 애플리케이션 아키텍처 (2-Tier)

EC2와 RDS를 활용한 데이터베이스 연동 동적 웹 애플리케이션 구축

Pasted image 20250909144011.png

아키텍처 개요

인터넷 사용자
    ↓ HTTP/HTTPS 요청
Internet Gateway
    ↓
VPC (10.0.0.0/16)
├── Public Subnet (10.0.1.0/24)
│   └── EC2 (Node.js + Express)
│       ├── 웹 서버
│       ├── 애플리케이션 서버  
│       └── 비즈니스 로직
└── Private Subnet (10.0.2.0/24)
    └── RDS MySQL (데이터베이스)

상세 네트워크 아키텍처

VPC 설계

VPC: webapp-vpc (10.0.0.0/16)
│
├── Internet Gateway: webapp-igw
│   └── 인터넷 연결 관문
│
├── Public Subnet: webapp-public-subnet
│   ├── CIDR: 10.0.1.0/24 (256개 IP)
│   ├── 가용영역: ap-northeast-2a
│   ├── 인터넷 라우팅: 있음
│   └── Auto-assign Public IP: 활성화
│
└── Private Subnet: webapp-private-subnet  
    ├── CIDR: 10.0.2.0/24 (256개 IP)
    ├── 가용영역: ap-northeast-2a
    ├── 인터넷 라우팅: 없음
    └── DB 서브넷 그룹 사용

라우팅 테이블

Public Route Table:
├── 10.0.0.0/16 → local (VPC 내부 통신)
└── 0.0.0.0/0 → igw-xxxx (인터넷 게이트웨이)

Private Route Table:
└── 10.0.0.0/16 → local (VPC 내부 통신만)

핵심 구성 요소

1. EC2 웹 서버 (Public Subnet)

인스턴스 사양:

설치된 소프트웨어:

Node.js v18+
├── Express.js (웹 프레임워크)
├── MySQL2 (데이터베이스 드라이버)
├── PM2 (프로세스 관리자)
└── 사용자 정의 웹 애플리케이션

보안 그룹 (webapp-web-sg):

인바운드 규칙:
├── SSH (22) ← 내 IP만
├── HTTP (80) ← 0.0.0.0/0  
├── Custom (3000) ← 0.0.0.0/0 (Node.js 앱)
└── Custom (8080) ← 0.0.0.0/0 (개발용)

아웃바운드 규칙:
└── All traffic → 0.0.0.0/0

2. RDS MySQL (Private Subnet)

데이터베이스 사양:

네트워크 설정:

DB 서브넷 그룹: webapp-db-subnet-group
├── Private Subnet (ap-northeast-2a)
└── Private Subnet (ap-northeast-2c) - 백업용

보안 그룹 (webapp-db-sg):
├── MySQL (3306) ← webapp-web-sg만
└── 아웃바운드 차단

애플리케이션 아키텍처

Node.js 애플리케이션 구조

/home/ec2-user/webapp/
├── app.js (메인 애플리케이션)
├── package.json (의존성 관리)
├── routes/
│   ├── index.js (기본 라우트)
│   └── users.js (사용자 관리)
├── views/
│   ├── index.ejs (메인 페이지)
│   └── users.ejs (사용자 목록)
└── config/
    └── database.js (DB 연결 설정)

데이터베이스 스키마

Database: webapp_db

Table: users
├── id (INT, PRIMARY KEY, AUTO_INCREMENT)
├── name (VARCHAR(100), NOT NULL)
├── email (VARCHAR(100), UNIQUE, NOT NULL)
├── created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
└── updated_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP ON UPDATE)

데이터 흐름

웹 페이지 요청 흐름

1. 사용자가 브라우저에서 접속
   http://EC2-Public-IP/
   
2. Internet Gateway를 통해 VPC 진입
   
3. Public Subnet의 EC2로 라우팅
   
4. Node.js Express 서버가 요청 처리
   ├── 정적 파일 (HTML, CSS, JS) → 직접 응답
   └── 동적 데이터 필요 → 5단계로
   
5. EC2에서 RDS MySQL 쿼리
   Private Subnet 내부 통신 (10.0.1.x → 10.0.2.x)
   
6. 데이터베이스 결과를 받아서 HTML 렌더링
   
7. 완성된 페이지를 사용자에게 응답

보안 설정

네트워크 보안

계층별 보안:
├── Internet Gateway: 인터넷 접근점 (1개소만)
├── Public Subnet: 웹 서버만 인터넷 노출
├── Private Subnet: 데이터베이스 완전 격리
└── 보안 그룹: 포트별 세밀한 접근 제어

접근 제어

SSH 접근:
├── 키 페어 인증만 허용
├── 내 IP 주소만 허용
└── root 로그인 비활성화

데이터베이스:
├── Private 서브넷 격리
├── 웹 서버에서만 접근 허용
├── 강력한 비밀번호 사용
└── 환경 변수로 자격 증명 관리

성능 특성

처리 능력

t2.micro 인스턴스 기준:
├── 동시 접속자: ~50-100명
├── 응답 시간: 200-500ms
├── 처리량: ~100 requests/sec
└── 메모리 사용량: ~500MB

병목 지점

잠재적 제약 사항:
├── EC2 단일 인스턴스 (SPOF)
├── CPU/메모리 제한 (t2.micro)
├── 데이터베이스 연결 수 제한
└── 네트워크 대역폭 (t2.micro: 낮음)

장점과 한계

장점

✅ 간단한 구조로 이해하기 쉬움
✅ 빠른 개발 및 배포 가능
✅ 비용 효율적 (소규모 프로젝트)
✅ Node.js 생태계 활용
✅ RDS 관리형 서비스 혜택

한계

❌ 단일 장애점 (SPOF)
❌ 확장성 제한
❌ 고가용성 부족
❌ 성능 병목 지점 다수
❌ 보안 취약점 가능성

Week 3로의 발전 경로

문제점과 해결 방안

문제: 웹 서버와 앱 서버가 하나의 EC2에 혼재
해결: Web/WAS 분리 아키텍처

문제: 단일 인스턴스 의존
해결: 다중 인스턴스 구성

문제: 확장성 부족
해결: 로드 밸런서 + Auto Scaling

다음 아키텍처 미리보기

Week 2 (현재):
사용자 → EC2 (Web+App) → RDS

Week 3 (목표):
사용자 → EC2 (Apache) → EC2 (Tomcat) → RDS

Week 2 완성: 데이터베이스 연동 동적 웹 애플리케이션 구축 완료
다음 단계: AWS EDU/Archive/조선대학교 AWS 멘토링/Edu Architecture/Week3-Three-Tier-Architecture - Web/WAS 분리로 확장성 향상